<?php
/**
 * 验证码工具类
 */
class Captcha {
	/**
	 * 验证是否正确
	 * @param $user_code 用户输入的
	 */
	public function checkCode($user_code) {
		@session_start();
		// 存在且相等
		// 大小写不敏感
		$result = isset($user_code) && isset($_SESSION['code']) && strtoupper($user_code) == strtoupper($_SESSION['code']);
		// 用过要销毁！
		unset($_SESSION['code']);

		// 返回比较结果
		return $result;
	}

	/**
	 * 生成验证
	 * @param int $code_len 验证码长度
	 */
	public function makeImage($code_len=4) {
		// 仿ecshop验证码

		// 处理码值
		$char_list = '123456789ABCDEFGHIJKLMNPQRSTUVWXYZ';// 所有可能的字符集
		$code = '';//初始化码值字符串
		// 循环N次，取N个随机字符
		$char_list_len = strlen($char_list);
		for($i=0; $i<$code_len; ++$i) {
			// 每次取得一个随机下标
			$rand_index = mt_rand(0, $char_list_len-1);//随机字符下标
			// 利用随机下标，获得随机字符，连接起来
			$code .= $char_list[$rand_index];//字符串支持，下标操作
		}
		// 存储于session中，为了验证
		@session_start();// 为了保证当前一定是开启session，同时又不会因为重复开启而触发notice错误，可以选择屏蔽掉错误消息。 忽略重复开启！
		$_SESSION['code'] = $code;

		// 形成验证码图片

		// 创建画布
		// 存在背景图片，基于背景图片创建画布
		// 随机背景图片地址
		$rand_bg_file = FRAME_PATH . 'captcha/captcha_bg' . mt_rand(1, 5) . '.jpg';
		// 创建
		$img = imagecreatefromjpeg($rand_bg_file);

		// 操作画布
		// 分配颜色
//		if (mt_rand(1, 6) <= 2) {// 随机分配，任何比例的分配
//			$code_color = imagecolorallocate($img, 0, 0, 0);//黑 3/5
//		} else {
//			$code_color = imagecolorallocate($img, 255, 0xff, 0xff);//白 2/5
//		}
		$code_color = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
		// 写字符串
		$font = 5;// 字体
		// 画布尺寸
		$img_w = imagesx($img);
		$img_h = imagesy($img);
		// 字体大小
		$font_w = imagefontwidth($font);
		$font_h = imagefontheight($font);
		// 字符串大小
		$code_w = $font_w * $code_len;
		$code_h = $font_h ;
		// 字符串位置
		$x = ($img_w - $code_w) / 2;
		$y = ($img_h - $code_h) / 2;
		imagestring($img, $font, $x, $y, $code, $code_color);

		// 输出，销毁
		header('Content-Type: image/jpeg');
		imagejpeg($img);

		imagedestroy($img);
	}
}